package cn.seaboot.admin.flake.manager;

import cn.seaboot.flake.mapping.Mapper;

import java.util.List;
import java.util.Map;

/**
 * 通用的代码执行器
 * @author Mr.css
 * @version 2022-02-15 16:18
 */
public interface Executor {

    /**
     * 返回完整的Mapper数据信息
     *
     * @param mapperGroup 映射分组
     * @param id          配置ID
     * @return 映射信息
     */
    Mapper queryMapperById(String mapperGroup, String id);

    /**
     * 程序总入口，按照ID自动检索配置，并且获得最终的执行结果
     *
     * @param mapperGroup 分组名称
     * @param id          配置ID
     * @param params      参数
     * @return 执行结果
     */
    Object execute(String mapperGroup, String id, Object params);

    /**
     * 执行一条命令
     *
     * @param mapper 映射配置
     * @param params 参数
     * @return 运行结果
     */
    Object executeCommand(Mapper mapper, Object params);

    /**
     * 执行一个更新
     *
     * @param mapper    配置
     * @param parameter 参数
     * @return 查询结果
     */
    Integer executeUpdate(Mapper mapper, Object parameter);

    /**
     * 执行一个查询
     *
     * @param mapper    配置
     * @param parameter 参数
     * @return 查询结果
     */
    Object executeQuery(Mapper mapper, Object parameter);

    /**
     * 执行一个查询
     *
     * @param mapper    配置
     * @param parameter 参数
     * @return 查询结果
     */
    List<Map<String, Object>> queryForMap(Mapper mapper, Object parameter);

    /**
     * 执行一个查询
     *
     * @param mapper    配置
     * @param parameter 参数
     * @return 查询结果
     */
    List<Object> queryForObject(Mapper mapper, Object parameter);

    /**
     * 执行一个存储过程
     *
     * @param mapper    配置
     * @param parameter 参数，OUT参数返回值会被填充到这个对象
     * @return 查询结果
     */
    Integer processCall(Mapper mapper, Object parameter);
}
